package com.gaogzhen.designPattern.immutableObject.mmscVasp;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

/**
 * @author Administrator
 * @version 1.0
 * @description 彩信中心路由规则管理器
 * @date 2022-10-13 10:24
 * 模式角色：Immutable Object
 */
public final class MMSCRouter {
    /**
     * volatile修饰，保证在多线程环境下的可见性     *
     */
    private static volatile MMSCRouter instance = new MMSCRouter();

    /**
     * 维护号码前缀到彩信中心的映射关系
     */
    private final Map<String, MMSCInfo> routeMap;

    public MMSCRouter() {
        // 通过把数据库中的数据初始化routeMap
        this.routeMap = MMSCRouter.retrieveRouteMapFromDB();
    }

    private static Map<String,MMSCInfo> retrieveRouteMapFromDB() {
        Map<String, MMSCInfo> map = new HashMap<>();
        // 省略其他代码
        return map;
    }

    public static MMSCRouter getInstance() {
        return instance;
    }

    /**
     * 根据手机号码前缀获取彩信中心信息
     * @param numPrefix     手机号码前缀
     * @return              彩信中心
     */
    public MMSCInfo getMMSC(String numPrefix) {
        return routeMap.get(numPrefix);
    }

    /**
     * 将当前MMSCRouter实例更新为新的实例
     * @param newInstance   MMSCRouter新实例
     */
    public static void setInstance(MMSCRouter newInstance) {
        instance = newInstance;
    }

    public Map<String, MMSCInfo> getRouteMap() {
        // 防御性复制
        return Collections.unmodifiableMap(deepCopy(routeMap));
    }

    private static Map<String, MMSCInfo> deepCopy(Map<String, MMSCInfo> original) {
        Map<String, MMSCInfo> newMap = new HashMap<>();
        for (String key: original.keySet()) {
            newMap.put(key, new MMSCInfo(original.get(key)));
        }
        return newMap;
    }
}
